package models.features;

import java.sql.SQLException;
import java.util.GregorianCalendar;
import java.util.Random;

import models.util.Area;
import core.User;
import core.database.DataBaseManager;

public class BrianBrain {
	private GregorianCalendar gc = new GregorianCalendar();
	private Random random = new Random();
	private User user;

	public BrianBrain(User user) {
		this.user = user;
	}

	public String parla() {
		try {
			return saluto() + nomeUtente() + frase();
		} catch (SQLException e) {
			return "";
		}
	}

	private String frase() throws SQLException {
		if (bestArea() == -1) {
			return "sei nuovo da queste parti? Inizia allenandoti in "
					+ areaName(random.nextInt(5) + 1);
		}
		switch (random.nextInt(4)) {
		case 0:
			return (user.getLevel() > 4) ? "sei molto bravo in "
					: "non sei male in " + areaName(bestArea())
							+ ", ora esercitati nelle altre aree ;-)";
		case 1:
			return "sei un po' carente in " + areaName(worstArea())
					+ ", dai corri ad allenarti";
		case 2:
			return "non credi sia la giornata ideale per allenare la mente?";
		case 3:
			return "ti aspettavo e, nel frattempo, mi sono allenato. Ora non mi starai più dietro :-P";
		default:
			return "";
		}

	}

	private int bestArea() throws SQLException {
		int average = 0;
		int bestArea = 0;
		for (int i = 1; i <= 5; i++) {
			int tmp = DataBaseManager.getAverage(i, user);
			if (tmp > average) {
				average = tmp;
				bestArea = i;
			}
		}
		if (average == 0)
			return -1;
		return bestArea;
	}

	private int worstArea() throws SQLException {
		int average = DataBaseManager.getAverage(1, user);
		int worstArea = 0;
		for (int i = 2; i <= 5; i++) {
			int tmp = DataBaseManager.getAverage(i, user);
			if (tmp < average) {
				average = tmp;
				worstArea = i;
			}
		}
		return worstArea;
	}

	private String areaName(int idArea) {
		switch (idArea) {
		case Area.ATTENZIONE:
			return "Attenzione";
		case Area.FLESSIBILITA:
			return "Flessibilita'";
		case Area.MEMORIA:
			return "Memoria";
		case Area.PROBLEM_SOLVING:
			return "Problem Solving";
		default:
			return "Velocita'";
		}
	}

	private String saluto() {
		final int TIPI_DI_SALUTO = 4;
		switch (random.nextInt(TIPI_DI_SALUTO)) {
		case 0:
			return "Ciao ";
		case 1:
			return "Hey ";
		case 2:
			final int ora = gc.get(GregorianCalendar.HOUR_OF_DAY);
			if (ora > 0 && ora < 5) {
				return "Buonanotte ";
			} else if (ora > 5 && ora < 14) {
				return "Buongiorno ";
			} else if (ora > 14 && ora < 18) {
				return "Buon pomeriggio ";
			} else {
				return "Buonasera ";
			}
		default:
			return "Salve ";
		}
	}

	private String nomeUtente() {
		return user.getUsername() + " ";
	}
}